package com.eugenema.demand.impl;

import com.alibaba.excel.util.StringUtils;
import com.eugenema.demand.Demand;
import com.eugenema.util.Annotation.DemandBean;
import com.eugenema.util.ConfigUtil;
import com.eugenema.util.DemandUtil.OnlineFileUtil;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXDialog;
import com.jfoenix.controls.JFXDialogLayout;
import com.jfoenix.controls.JFXTextField;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>标题：F5 填赛果</p>
 * <p>
 *  功能：获取已经比赛的数据，填入在线文档中
 * </p>
 * <p>其他说明：</p>
 * <p>作者：马寅广</p>
 * <p>审核：</p>
 * <p>重构：</p>
 * <p>创建日期：2024/1/1 14:18</p>
 */
@DemandBean(key = DemandF5FillMatchResult.DEMAND_FOUR_LINK_CONFIG, title = "F5 填赛果", notice = "获取已经比赛的数据，填入在线文档中", order = 2)
public class DemandF5FillMatchResult extends Demand {
    /** 需求四要编辑的在线文档链接 */
    public static final String DEMAND_FOUR_LINK_CONFIG = "demandFourLinkConfig";
    /** F5 填赛果的目标球队链接 */
    public static List<List<String>> targetLinkList = new ArrayList<>();
    /** 获取最近一场比赛的时间、单双信息的 xpath */
    public static final String XPATH_FIRST_MATCH_INFO = "//*[@id='wqMatchs']/tbody[1]/tr[1]/td[10]/span[2]|//*[@id='wqMatchs']/tbody[1]/tr[1]/td[2]";


    /**
     * 需求方法体
     * <br/> 需求执行的具体逻辑
     *
     * @return 执行结果
     * @author 马寅广
     * @date 2023/12/31 20:52
     **/
    @Override
    public boolean execute() {
        // 获取在线文档链接
        String onlineFileLink = OnlineFileUtil.getOnlineFileLink(DEMAND_FOUR_LINK_CONFIG, getTitle());
        if (onlineFileLink == null) {
            return false;
        }
        /** 目标球队的时间及单双数据 */
        List<List<String>> targetTimeAndSingList = new ArrayList<>();
        // 1、登录在线文档
        if (!OnlineFileUtil.login(RunSeleniumService())) {
            return false;
        }
        // 2、打开共享文档
        if (!OnlineFileUtil.load(RunSeleniumService(), onlineFileLink)) {
            return false;
        }
        // 3、获取目标球队数据(List(时间、目标球队链接、目标球队名称)))并存入全局
        targetLinkList = OnlineFileUtil.getTargetTeamInfo(RunSeleniumService());
        // 4、获取目标球队比赛信息
        Logger().info("开始获取比赛信息...");
        for (List<String> targetItem : targetLinkList) {
            // 若目标球队链接为空，则存入空值
            List<String> timeAndSingList = Arrays.asList("", "");
            // 否则获取球队信息
            if (StringUtils.isNotBlank(targetItem.get(1))) {
                timeAndSingList = OnlineFileUtil.getInfo(RunSeleniumService(), targetItem.get(1), XPATH_FIRST_MATCH_INFO, "获取最近一场比赛的时间、单双信息");
            }
            targetTimeAndSingList.add(timeAndSingList);
        }
        // 因为后续可能其他需求需要导入目标球队链接，所以需要去掉空值
        targetLinkList = targetLinkList.stream().filter(targetItem -> StringUtils.isNotBlank(targetItem.get(1))).collect(Collectors.toList());
        // 5、调用网页方法，填写数据
        Logger().info("获取数据完成，开始进行数据处理回填……");
        if (!OnlineFileUtil.load(RunSeleniumService(), onlineFileLink)) {
            return false;
        }
        // 6、开始处理，并进行表格回填
        return OnlineFileUtil.dealData(RunSeleniumService(), "f5FillIn", targetTimeAndSingList);
    }

    /**
     * 初始化按钮
     *
     * @author 马寅广
     * @date 2023/12/31 19:30
     **/
    @Override
    public void initButton() {
        createCustomDialogButton("编辑参数", "fi-pencil");
    }

    /**
     * 创建参数编辑对话框
     *
     * @author 马寅广
     * @date 2024/1/1 14:33
     *
     * @return 弹窗
     *
     **/
    public JFXDialog createCustomDialog() {
        JFXDialog dialog = new JFXDialog();
        JFXDialogLayout dialogLayout = new JFXDialogLayout();
        dialogLayout.setHeading(new Label("需求参数编辑"));

        // 主内容
        Label label = new Label("请编辑在线文档链接，禁止空格等字符，正确举例：https://kdocs.cn/l/cobbijtI7kXJ");
        label.setStyle("-fx-padding: 0 0 20 0");
        JFXTextField textField = new JFXTextField();
        textField.setPromptText("在线文档链接");
        // 读取配置文件
        textField.setText(ConfigUtil.getProperty(DEMAND_FOUR_LINK_CONFIG));
        VBox vBox = new VBox();
        vBox.getChildren().addAll(label, textField);
        dialogLayout.setBody(vBox);

        // 确定按钮
        JFXButton button = new JFXButton("确定");
        button.getStyleClass().add("dialog-accept");
        button.setOnMouseClicked((e) -> {
            // 保存参数
            ConfigUtil.setPropertySingle(DEMAND_FOUR_LINK_CONFIG, textField.getText());
            // 关闭弹窗
            dialog.close();
        });
        dialogLayout.setActions(button);

        dialog.setContent(dialogLayout);
        dialog.setTransitionType(JFXDialog.DialogTransition.CENTER);

        return dialog;
    }
}
